package cn.zd.util;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class CSVUtils {

  /**
   * 导出生成csv格式的文件
   *
   * @param filePath   存储文件路径
   * @param titles     csv格式头文
   * @param properties 需要导出的数据实体的属性，注意与title一一对应
   * @param list       需要导出的对象集合
   * @return
   * @throws Exception
   */
  public static <T> void exportCsv(String filePath, String[] titles, String[] properties,
      List<T> list)
      throws Exception {
    //构建输出流，同时指定编码
    BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream(filePath, true),
            StandardCharsets.UTF_8));
    try {
      //csv文件是逗号分隔，除第一个外，每次写入一个单元格数据后需要输入逗号
      for (String title : titles) {
        writer.write(title);
        writer.write(",");
      }
      //写完文件头后换行
      writer.write("\r\n");
      //写内容
      for (Object obj : list) {
        //利用反射获取所有字段
        Field[] fields = obj.getClass().getDeclaredFields();
        for (String property : properties) {
          for (Field field : fields) {
            //设置字段可见性
            field.setAccessible(true);
            if (property.equals(field.getName())) {
              writer.write(String.valueOf(field.get(obj)));
              writer.write(",");
            }
          }
        }
        //写完一行换行
        writer.write("\r\n");
      }
      writer.flush();
    } catch (Exception e) {
      e.printStackTrace();
//			throw new Exception("生成【"+filePath+"】失败");
    } finally {
      writer.close();
    }

  }


}
